/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package compilador;

import compilador.analisadorLexico.AnalisadorLexico;
import compilador.analisadorLexico.Token;
import compilador.analisadorLexico.TokenClass;
import compilador.analisadorLexico.TokenErro;
import compilador.analisadorSemantico.AnalisadorSemantico;
import compilador.analisadorSemantico.ErroSemantico;
import compilador.analisadorSintatico.AnalisadorSintatico;
import compilador.analisadorSintatico.TokenReader;
import compilador.analisadorSintatico.simboloGramatical.ArvoreSintatica;
import compilador.analisadorSintatico.simboloGramatical.ErroSintatico;
import compilador.analisadorSintatico.simboloGramatical.NaoTerminal;
import compilador.analisadorSintatico.simboloGramatical.SimboloGramatical;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Thiago
 */
public class Compilador {

    private AnalisadorLexico analisadorLexico = null;

    private AnalisadorSintatico analisadorSintatico = null;

    private AnalisadorSemantico analisadorSemantico = null;
    
    private List<ErroSintatico> errosSintaticos;
    private List<ErroSemantico> errosSemanticos;

    public Compilador() {
        analisadorSemantico = new AnalisadorSemantico();
    }

    public void compilar(String code){
        //limpa os erros
        errosSemanticos = new ArrayList<ErroSemantico>();
        
        analisadorLexico = new AnalisadorLexico(code);
        analisadorLexico.extraiTokens();
        
        //se não houve erros léxicos
        if(analisadorLexico.getErros().isEmpty() && !analisadorLexico.getTokens().isEmpty()){
            analisadorSintatico = new AnalisadorSintatico(analisadorLexico.getTokens());
            analisadorSintatico.analisar();
            
            errosSintaticos = analisadorSintatico.getErros();
            
            if(analisadorSintatico.getErros().isEmpty()){
                analisadorSemantico.analisar(getArvoreSintatica());

                errosSemanticos = analisadorSemantico.getErrosSemanticos();
            }
        }

    }
    
    public List<Token> getTokens(){
        return analisadorLexico.getTokens();
    }
    
    public List<TokenErro> getErrosLexicos(){
        return analisadorLexico.getErros();
    }
    
    public ArvoreSintatica getArvoreSintatica(){
        return analisadorSintatico.getArvoreSintatica();
    }
    
    public List<ErroSintatico> getErrosSintaticos(){
        return errosSintaticos;
    }

    public List<ErroSemantico> getErrosSemanticos() {
        return errosSemanticos;
    }

}
